#pragma once
#include <iostream>
#include <string>

int mymath(int x,int y,char op);

class Task 
{
    using func_t = function<int(int,int,char)>;
public:
    Task(){}

    Task(int x, int y, char op, func_t fun = mymath)
    :_x(x),_y(y),_op(op),_fun(fun)
    {}

    string operator()()
    {
        int result = _fun(_x,_y,_op);
        char buffer[64];
        snprintf(buffer,sizeof buffer,"%d %c %d = %d",_x,_op,_y,result);
        return buffer;
    }

    string to_stringname()
    {
        char buffer[64];
        snprintf(buffer,sizeof buffer,"%d %c %d = ?",_x,_op,_y);
        return buffer;
    }

private:
    int _x;
    int _y;
    char _op;
    func_t _fun;
};

string oper = "+-*/%";

int mymath(int x,int y,char op)
{
    int result = 0;
    switch(op)
    {
        case '+':
            result = x+y;
            break;
        case '-':
            result = x-y;
            break;
        case '*':
            result = x*y;
            break;
        case '/':
        {
            if(y == 0)
            {
                std::cerr << "div zero error!" << endl;
                result = -1;
            }
            else 
                result = x/y;
            break;
        }
        case '%':
        {
            if(y == 0)
            {
                cerr << "mod zero error!" << endl;
                result = -1;
            }
            else 
                result = x%y;
            break;
        }
    }

    return result;
}